/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.controler.jdbc;

import com.camachosanchez.bean.*;
import com.camachosanchez.util.ConexionSQL;
import com.camachosanchez.util.Constantes;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Zully
 */
public class NeumaticosJdbcControler {

    public NeumaticosJdbcControler() {
    }
    
    public Neumaticos findNeumatico(int id) {
        Neumaticos neumatico = null;
        Connection cn = ConexionSQL.obtenerConexion();
        Statement st;
        try {
            st = cn.createStatement();
            ResultSet rs = st.executeQuery("SELECT n.id, n.codigo, n.num_serie, m.medida, mn.nombre, n.id_categoria, c.nombre, n.fecha_registro, "
                    + "e.nombre, t.nombre, n.num_capas, a.nombre, n.fecha_compra, n.precio, n.num_renovaciones, "
                    + "n.distancia_recorrida, d.nombre, n.num_factura, n.id_categoria "
                    + "FROM neumaticos n inner join categorias c on n.id_categoria=c.id "
                    + "LEFT JOIN modelos_banda_neumatico m on n.id_modelo=m.id "
                    + "LEFT JOIN marcas_neumatico mn on n.id_marca = mn.id "
                    + "LEFT JOIN estados_neumaticos e on n.id_estado = e.id "
                    + "LEFT JOIN tipo_piso t on n.tipo_piso = t.id "
                    + "LEFT JOIN almacenes a on n.id_almacen = a.id "
                    + "LEFT JOIN distribuidores_neumaticos d on n.id_distribuidor = d.id "
                    + "WHERE n.id = " + id);
            if(rs.next()) {
                neumatico = new Neumaticos();
                neumatico.setId(rs.getInt(1));
                neumatico.setCodigo(rs.getString(2));
                neumatico.setNumSerie(rs.getString(3));
//                neumatico.setIdCategoria(new Categorias(rs.getInt(19)));
                ModelosBandaNeumatico m = new ModelosBandaNeumatico();
                m.setMedida(rs.getString(4));
                neumatico.setIdModelo(m);

                MarcasNeumatico marca = new MarcasNeumatico();
                marca.setNombre(rs.getString(5));
                neumatico.setIdMarca(marca);

                Categorias c = new Categorias();
                c.setId(rs.getInt(6));
                c.setNombre(rs.getString(7));
                neumatico.setIdCategoria(c);

                neumatico.setFechaRegistro(rs.getDate(8));

                EstadosNeumaticos e = new EstadosNeumaticos();
                e.setNombre(rs.getString(9));
                neumatico.setIdEstado(e);

                TipoPiso tipoP = new TipoPiso();
                tipoP.setNombre(rs.getString(10));
                neumatico.setTipoPiso(tipoP);

                neumatico.setNumCapas(rs.getInt(11));

                Almacenes a = new Almacenes();
                a.setNombre(rs.getString(12));
                neumatico.setIdAlmacen(a);

                neumatico.setFechaCompra(rs.getDate(13));
                neumatico.setPrecio(rs.getFloat(14));
                neumatico.setNumRenovaciones(rs.getInt(15));
                neumatico.setDistanciaRecorrida(rs.getInt(16));

                DistribuidoresNeumaticos d = new DistribuidoresNeumaticos();
                d.setNombre(rs.getString(17));
                neumatico.setIdDistribuidor(d);

                neumatico.setNumFactura(rs.getString(18));
            }
            rs.close();
            st.close();
            cn.close();
        } catch (SQLException ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return neumatico;
    }

    public List<Neumaticos> findAll(){
        List<Neumaticos> lst = new ArrayList<Neumaticos>();
        Connection cn = ConexionSQL.obtenerConexion();
        Statement st;
        try {
            st = cn.createStatement();
//            ResultSet rsId = st.executeQuery("SELECT IFNULL(MIN(n.id),0) from neumaticos n;");
//            int primerId = 0;
//            if (rsId.first()) {
//                primerId = rsId.getInt(1);
//            }
            ResultSet rs = st.executeQuery("SELECT n.id, n.codigo, m.medida, mn.nombre, n.id_categoria, c.nombre, n.fecha_registro, "
                    + "e.nombre, t.nombre, n.num_capas, a.nombre, n.fecha_compra, n.precio, n.num_renovaciones, "
                    + "n.km_total, d.nombre, n.num_factura, n.num_serie, n.labrado_exterior, n.labrado_central, n.labrado_interno, n.inf_montaje, en.nombre "
                    + "FROM neumaticos n LEFT JOIN categorias c on n.id_categoria=c.id "
                    + "LEFT JOIN modelos_banda_neumatico m on n.id_modelo=m.id "
                    + "LEFT JOIN marcas_neumatico mn on n.id_marca = mn.id "
                    + "LEFT JOIN estados_medicion e on n.id_estado_medicion = e.id "
                    + "LEFT JOIN estados_neumaticos en on n.id_estado = en.id "
                    + "LEFT JOIN tipo_piso t on n.tipo_piso = t.id "
                    + "LEFT JOIN almacenes a on n.id_almacen = a.id "
                    + "LEFT JOIN distribuidores_neumaticos d on n.id_distribuidor = d.id "
                    + "WHERE n.estado=1 AND id_categoria<>" + Constantes.CATEGORIA_CEMENTERIO);
                    //+ "WHERE n.estado=1 AND ((CAST(n.id AS SIGNED) - " + primerId + ") < 50) LIMIT 0,50;");
            while (rs.next()) {
                Neumaticos n = new Neumaticos();
                n.setId(rs.getInt(1));
                n.setCodigo(rs.getString(2));

                ModelosBandaNeumatico m = new ModelosBandaNeumatico();
                m.setMedida(rs.getString(3));
                n.setIdModelo(m);

                MarcasNeumatico marca = new MarcasNeumatico();
                marca.setNombre(rs.getString(4));
                n.setIdMarca(marca);

                Categorias c = new Categorias();
                c.setId(rs.getInt(5));
                c.setNombre(rs.getString(6));
                n.setIdCategoria(c);

                n.setFechaRegistro(rs.getDate(7));

                EstadosMedicion e = new EstadosMedicion();
                e.setNombre(rs.getString(8));
                n.setIdEstadoMedicion(e);

                TipoPiso tipoP = new TipoPiso();
                tipoP.setNombre(rs.getString(9));
                n.setTipoPiso(tipoP);

                n.setNumCapas(rs.getInt(10));

                Almacenes a = new Almacenes();
                a.setNombre(rs.getString(11));
                n.setIdAlmacen(a);

                n.setFechaCompra(rs.getDate(12));
                n.setPrecio(rs.getFloat(13));
                n.setNumRenovaciones(rs.getInt(14));
                n.setKmTotal(rs.getInt(15));

                DistribuidoresNeumaticos d = new DistribuidoresNeumaticos();
                d.setNombre(rs.getString(16));
                n.setIdDistribuidor(d);

                n.setNumFactura(rs.getString(17));
                n.setNumSerie(rs.getString(18));
                n.setLabradoExterior(rs.getDouble(19));
                n.setLabradoCentral(rs.getDouble(20));
                n.setLabradoInterno(rs.getDouble(21));
                n.setInfMontaje(rs.getString(22));
                
                EstadosNeumaticos en = new EstadosNeumaticos();
                en.setNombre(rs.getString(23));
                n.setIdEstado(en);
                lst.add(n);
            }
            rs.close();
            st.close();
            cn.close();
        } catch (SQLException ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lst;
    }
    
    public List<Neumaticos> findNeumaticosStock(){
        List<Neumaticos> neumaticos = new ArrayList<Neumaticos>();
        try {
            Connection cn = ConexionSQL.obtenerConexion();
            Statement st = cn.createStatement();
//            ResultSet rsId = st.executeQuery("SELECT IFNULL(MIN(n.id),0) from neumaticos n;");
//            int primerId = 0;
//            if (rsId.first()) {
//                primerId = rsId.getInt(1);
//            }
            ResultSet rs = st.executeQuery("SELECT neumaticos.id, codigo, num_serie, num_renovaciones, medida, marcas_neumatico.nombre, distancia_recorrida, num_capas, id_categoria FROM neumaticos "
                    + "LEFT JOIN modelos_banda_neumatico on neumaticos.id_modelo=modelos_banda_neumatico.id "
                    + "LEFT JOIN marcas_neumatico on neumaticos.id_marca = marcas_neumatico.id "
                    + "where neumaticos.estado=1 and (id_categoria=1 or id_categoria=7);");
                    //+ "where neumaticos.estado=1 and (id_categoria=1 or id_categoria=7) AND ((CAST(neumaticos.id AS SIGNED) - " + primerId + ") < 50) LIMIT 0,50;");
            while (rs.next()) {
                Neumaticos neumatico = new Neumaticos();
                neumatico.setId(rs.getInt(1));
                neumatico.setCodigo(rs.getString(2));
                neumatico.setNumSerie(rs.getString(3));
                neumatico.setNumRenovaciones(rs.getInt(4));
                ModelosBandaNeumatico modelo = new ModelosBandaNeumatico();
                modelo.setMedida(rs.getString(5));
                neumatico.setIdModelo(modelo);
                MarcasNeumatico marca = new MarcasNeumatico();
                marca.setNombre(rs.getString(6));
                neumatico.setIdMarca(marca);
                neumatico.setDistanciaRecorrida(rs.getInt(7));
                neumatico.setNumCapas(rs.getInt(8));
                neumatico.setIdCategoria(new Categorias(rs.getInt(9)));
                neumaticos.add(neumatico);
            }
            rs.close();
            st.close();
            cn.close();
        } catch (Exception ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return neumaticos;
    }
    
    public List<Neumaticos> findNeumaticosParaReencauche(){
        List<Neumaticos> neumaticos = new ArrayList<Neumaticos>();
        try {
            Connection cn = ConexionSQL.obtenerConexion();
            Statement st = cn.createStatement();
            ResultSet rs = st.executeQuery("SELECT neumaticos.id, codigo, num_serie, num_renovaciones, medida, marcas_neumatico.nombre, distancia_recorrida, num_capas, id_categoria FROM neumaticos "
                    + "LEFT JOIN modelos_banda_neumatico on neumaticos.id_modelo=modelos_banda_neumatico.id "
                    + "LEFT JOIN marcas_neumatico on neumaticos.id_marca = marcas_neumatico.id "
                    + "where neumaticos.estado=1 and id_categoria=8;");
                    //+ "where neumaticos.estado=1 and (id_categoria=1 or id_categoria=7) AND ((CAST(neumaticos.id AS SIGNED) - " + primerId + ") < 50) LIMIT 0,50;");
            while (rs.next()) {
                Neumaticos neumatico = new Neumaticos();
                neumatico.setId(rs.getInt(1));
                neumatico.setCodigo(rs.getString(2));
                neumatico.setNumSerie(rs.getString(3));
                neumatico.setNumRenovaciones(rs.getInt(4));
                ModelosBandaNeumatico modelo = new ModelosBandaNeumatico();
                modelo.setMedida(rs.getString(5));
                neumatico.setIdModelo(modelo);
                MarcasNeumatico marca = new MarcasNeumatico();
                marca.setNombre(rs.getString(6));
                neumatico.setIdMarca(marca);
                neumatico.setDistanciaRecorrida(rs.getInt(7));
                neumatico.setNumCapas(rs.getInt(8));
                neumatico.setIdCategoria(new Categorias(rs.getInt(9)));
                neumaticos.add(neumatico);
            }
            rs.close();
            st.close();
            cn.close();
        } catch (Exception ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return neumaticos;
    }
    
    public byte eliminarNeumatico(int id) {
        byte estado = 0;
        try {
            Connection cn = ConexionSQL.obtenerConexion();
            CallableStatement sp = cn.prepareCall("{ call eliminar_neumatico(?) }");
            sp.setInt("idNeumatico", id);
            ResultSet rs = sp.executeQuery();
            if(rs.next()){
                estado = rs.getByte(1);
            }
            rs.close();
            sp.close();
            cn.close();
        } catch (SQLException ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return estado;
    }
    
    public boolean existeNeumatico(String codigo) {
        boolean existe = false;
        Connection cn = ConexionSQL.obtenerConexion();
        try {
            Statement st = cn.createStatement();
            ResultSet rs = st.executeQuery("SELECT id FROM neumaticos where codigo='" + codigo + "' AND estado = 1;");
            if (rs.first()) {
                existe = true;
            }
            rs.close();
            st.close();
            cn.close();
        } catch (Exception e) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, e);
        }
        return existe;
    }
    
    public List<Neumaticos> findNeumaticosByPage(int nroPagina, int nroNeumXPagina) {
        List<Neumaticos> lst = new ArrayList<Neumaticos>();
        Connection cn = ConexionSQL.obtenerConexion();
        Statement st;
        int desde = (nroPagina - 1) * (nroNeumXPagina);
        try {
            st = cn.createStatement();
            ResultSet rs = st.executeQuery("SELECT n.id, n.codigo, m.medida, mn.nombre, n.id_categoria, c.nombre, n.fecha_registro, "
                    + "e.nombre, t.nombre, n.num_capas, a.nombre, n.fecha_compra, n.precio, n.num_renovaciones, "
                    + "n.distancia_recorrida, d.nombre, n.num_factura "
                    + "FROM neumaticos n inner join categorias c on n.id_categoria=c.id "
                    + "LEFT JOIN modelos_banda_neumatico m on n.id_modelo=m.id "
                    + "LEFT JOIN marcas_neumatico mn on n.id_marca = mn.id "
                    + "LEFT JOIN estados_neumaticos e on n.id_estado = e.id "
                    + "LEFT JOIN tipo_piso t on n.tipo_piso = t.id "
                    + "LEFT JOIN almacenes a on n.id_almacen = a.id "
                    + "LEFT JOIN distribuidores_neumaticos d on n.id_distribuidor = d.id "
                    + "WHERE n.estado=1 ORDER BY n.id LIMIT " + desde +", " + nroNeumXPagina);
            while (rs.next()) {
                Neumaticos n = new Neumaticos();
                n.setId(rs.getInt(1));
                n.setCodigo(rs.getString(2));

                ModelosBandaNeumatico m = new ModelosBandaNeumatico();
                m.setMedida(rs.getString(3));
                n.setIdModelo(m);

                MarcasNeumatico marca = new MarcasNeumatico();
                marca.setNombre(rs.getString(4));
                n.setIdMarca(marca);

                Categorias c = new Categorias();
                c.setId(rs.getInt(5));
                c.setNombre(rs.getString(6));
                n.setIdCategoria(c);

                n.setFechaRegistro(rs.getDate(7));

                EstadosNeumaticos e = new EstadosNeumaticos();
                e.setNombre(rs.getString(8));
                n.setIdEstado(e);

                TipoPiso tipoP = new TipoPiso();
                tipoP.setNombre(rs.getString(9));
                n.setTipoPiso(tipoP);

                n.setNumCapas(rs.getInt(10));

                Almacenes a = new Almacenes();
                a.setNombre(rs.getString(11));
                n.setIdAlmacen(a);

                n.setFechaCompra(rs.getDate(12));
                n.setPrecio(rs.getFloat(13));
                n.setNumRenovaciones(rs.getInt(14));
                n.setDistanciaRecorrida(rs.getInt(15));

                DistribuidoresNeumaticos d = new DistribuidoresNeumaticos();
                d.setNombre(rs.getString(16));
                n.setIdDistribuidor(d);

                n.setNumFactura(rs.getString(17));
                lst.add(n);
            }
            rs.close();
            st.close();
            cn.close();
        } catch (SQLException ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lst;
    }
    
    public int countNeumaticos() {
        int nroRegistros = 0;
        Connection cn = ConexionSQL.obtenerConexion();
        
        return nroRegistros;
    }
    
    public List<Object[]> reencauchesXMarca(int anio, int mes) {
        List<Object[]> lst = new ArrayList<Object[]>();
        try {
            Connection cn = ConexionSQL.obtenerConexion();
            Statement st = cn.createStatement();
//            ResultSet rs = st.executeQuery("SELECT COUNT(n.id) AS Cantidad, AVG(n.num_renovaciones) AS Reencauches, m.nombre AS Marca"
//                                         + " FROM neumaticos n"
//                                         + " INNER JOIN marcas_neumatico m ON n.id_marca = m.id"
//                                         + " WHERE YEAR(n.fecha_compra)=" + anio + " AND MONTH(n.fecha_compra)= " + mes + " AND n.num_renovaciones<>0"
//                                         + " GROUP BY n.id_marca;");
            ResultSet rs = st.executeQuery("SELECT COUNT(n.id) AS Cantidad, AVG(n.num_renovaciones) AS Reencauches, m.nombre AS Marca"
                                           + " FROM neumaticos n"
                                           + " INNER JOIN detalle_control_reencauche r ON r.id_neumatico = n.id"
                                           + " LEFT JOIN marcas_neumatico m ON n.id_marca = m.id"
                                           + " WHERE YEAR(n.fecha_compra)=" + anio + " AND MONTH(n.fecha_compra)= " + mes
                                           + " GROUP BY n.id_marca;");
            while (rs.next()) {
                Object[] data = new Object[3];
                data[0] = rs.getInt(1);
                data[1] = rs.getDouble(2);
                data[2] = rs.getString(3);
                lst.add(data);
            }
            rs.close();
            st.close();
            cn.close();
        } catch (Exception ex) {
            Logger.getLogger(NeumaticosJdbcControler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lst;
    }
}
